package Domaine;

import Domaine.Noeud;

/**
 * 
 * @author Noyau
 * @version 1.0
 * @since 2013-11-12
 * File Segment.java
 *
 */
public class Segment implements Comparable<Segment>, Cloneable
{
	//Attributs 
	private Noeud _noeudDepart;
	private Noeud _noeudFin;
	private float _longueur;	//La longueur du segment entre 2 Noeuds

	/**
	 * Constructeur du segment 
	 * @param aDepart Le Noeud de d�part du segment
	 * @param aFin Le Noeud de fin du segment
	 * 
	 */
	public Segment(Noeud aDepart, Noeud aFin) 
	{
		_noeudDepart = aDepart;
		_noeudFin = aFin;
		_longueur = Noeud.calculerDistanceEntreDeuxNoeuds(_noeudDepart, _noeudFin);
	}
	
	public Segment clone() 
	{
		Segment copy = null;
		try
		{
			copy = (Segment) super.clone();
		} catch(CloneNotSupportedException copyExcept)
		{
			copyExcept.printStackTrace(System.err);
		}
	
//		copy._noeudDepart = _noeudDepart.clone();
//		copy._noeudFin = _noeudFin.clone();
		return copy;
	}

	/**
	 * M�thode Get du Noeud de d�part
	 * @return Le noeud de d�part du segment
	 */
	public Noeud getNoeudDepart() 
	{
		return this._noeudDepart;
	}

	/**
	 * M�thode Set du Noeud de d�part
	 * @param aNoeudDepart Le noeud de d�part du segment
	 */
	public void setNoeudDepart(Noeud aNoeudDepart) 
	{
		this._noeudDepart = aNoeudDepart;
		this._longueur = Noeud.calculerDistanceEntreDeuxNoeuds(aNoeudDepart, _noeudFin);
	}

	/**
	 * M�thode Get du Noeud de fin
	 * @return Le noeud de fin du segment
	 */
	public Noeud getNoeudFin() 
	{
		return this._noeudFin;
		
	}

	/**
	 * M�thode Set du Noeud de fin
	 * @param aNoeudFin Le noeud de fin du segment
	 */
	public void setNoeudFin(Noeud aNoeudFin) 
	{
		this._noeudFin = aNoeudFin;
		this._longueur = Noeud.calculerDistanceEntreDeuxNoeuds(_noeudDepart, aNoeudFin);
	}

	/**
	 * @return _longueur La longueur du segment
	 */
	public float get_longueur() 
	{
		return _longueur;
	}

	@Override
	public int compareTo(Segment o) {
		return Float.compare(_longueur, o._longueur);
	}
	
	@Override
	public boolean equals(Object obj){
		boolean b = false;
		
		if(obj instanceof Segment){
			Segment s = (Segment) obj;
			if(s.getNoeudDepart().equals(this._noeudDepart) && s.getNoeudFin().equals(this._noeudFin)
					|| s.getNoeudDepart().equals(this._noeudFin) && s.getNoeudFin().equals(this._noeudDepart)){
				
				// Les segments sont non orient�s il est important de v�rifier dans les deux sens,
				// vu qu'on ne peut avoir de doublons invers�s.
				b = true;
				
			}
		}
		return b;
	}

}